package beanstao.util.table;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

public class Metas implements List<Meta>
{
	private final List<Meta> metas = new ArrayList<Meta>();

	// private static Metas fromXmlElement(Element element)
	// {
	// // 同时应将View界面需要的一系列值置入
	// // id, header, sortable, width, hidden, renderer
	// Metas metas = new Metas();
	// for (Element metaEle : element.elements())
	// {
	// String name = metaEle.attributeValue("name");
	// boolean canNull = Boolean.parseBoolean(metaEle.attributeValue("cannull"));
	// int length = Integer.parseInt(metaEle.attributeValue("length"));
	// Class<?> klass = null;
	// try
	// {
	// klass = Class.forName(metaEle.attributeValue("class"));
	// }
	// catch (ClassNotFoundException e)
	// {
	// }
	// Meta meta = new Meta(name, canNull, length, klass, 0);
	// metas.add(meta);
	// }
	// return metas;
	// }

	// == List<Meta> 实现=============

	@Override
	public boolean add(Meta meta)
	{
		if (this.contains(meta))
			return false;
		return this.metas.add(meta);
	}

	@Override
	public void add(int index, Meta meta)
	{
		if (!this.contains(meta))
		{
			this.metas.add(index, meta);
		}
	}

	@Override
	public boolean addAll(Collection<? extends Meta> c)
	{
		int i = 0;
		for (Meta meta : c)
		{
			if (this.add(meta))
			{
				i++;
			}
		}
		return c.size() == i;
	}

	@Override
	public boolean addAll(int index, Collection<? extends Meta> c)
	{
		int i = 0;
		for (Meta meta : c)
		{
			List<Meta> list = new ArrayList<Meta>();
			list.add(meta);
			if (this.metas.addAll(index, list))
			{
				i++;
				index++;
			}
		}
		return c.size() == i;
	}

	@Override
	public void clear()
	{
		this.metas.clear();
	}

	@Override
	public boolean contains(Object o)
	{
		return this.metas.contains(o);
	}

	public boolean contains(String name)
	{
		for (Meta meta : this.metas)
		{
			if (meta.getName().equals(name))
				return true;
		}
		return false;
	}

	@Override
	public boolean containsAll(Collection<?> c)
	{
		return this.metas.containsAll(c);
	}

	public Meta get(String name)
	{
		for (Meta meta : this.metas)
		{
			if (meta.getName().equals(name))
				return meta;
		}
		return null;
	}

	@Override
	public Meta get(int index)
	{
		return this.metas.get(index);
	}

	@Override
	public int indexOf(Object o)
	{
		return this.metas.indexOf(o);
	}

	public int indexOf(Meta meta)
	{
		return this.metas.indexOf(meta);
	}

	public int indexOf(String name)
	{
		for (int i = 0; i < this.metas.size(); i++)
		{
			if (this.metas.get(i).getName().equals(name))
				return i;
		}
		return -1;
	}

	@Override
	public boolean isEmpty()
	{
		return this.metas.isEmpty();
	}

	@Override
	public Iterator<Meta> iterator()
	{
		return this.metas.iterator();
	}

	@Override
	public int lastIndexOf(Object o)
	{
		return this.metas.lastIndexOf(o);
	}

	@Override
	public ListIterator<Meta> listIterator()
	{
		return this.metas.listIterator();
	}

	@Override
	public ListIterator<Meta> listIterator(int index)
	{
		return this.metas.listIterator(index);
	}

	@Override
	public boolean remove(Object o)
	{
		return this.metas.remove(o);
	}

	@Override
	public Meta remove(int index)
	{
		return this.metas.remove(index);
	}

	@Override
	public boolean removeAll(Collection<?> c)
	{
		return this.metas.removeAll(c);
	}

	@Override
	public boolean retainAll(Collection<?> c)
	{
		return this.metas.retainAll(c);
	}

	@Override
	public Meta set(int index, Meta element)
	{
		return this.metas.set(index, element);
	}

	@Override
	public int size()
	{
		return this.metas.size();
	}

	@Override
	public List<Meta> subList(int fromIndex, int toIndex)
	{
		return this.metas.subList(fromIndex, toIndex);
	}

	@Override
	public Object[] toArray()
	{
		return this.metas.toArray();
	}

	@Override
	public <T> T[] toArray(T[] a)
	{
		return this.metas.toArray(a);
	}

}
